package chapter9.homework;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 学生信息类，包含学生信息
 */
class Student {
    private String id;
    private String name;
    private Double chinese;
    private Double math;
    private Double english;
    private Double sum;
    private LocalDateTime dateTime;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getChinese() {
        return chinese;
    }

    public void setChinese(Double chinese) {
        this.chinese = chinese;
    }

    public Double getMath() {
        return math;
    }

    public void setMath(Double math) {
        this.math = math;
    }

    public Double getEnglish() {
        return english;
    }

    public void setEnglish(Double english) {
        this.english = english;
    }

    public Double getSum() {
        return sum;
    }

    public void setSum(Double sum) {
        this.sum = sum;
    }

    public LocalDateTime getDateTime() {
        return dateTime;
    }

    public void setDateTime(LocalDateTime dateTime) {
        this.dateTime = dateTime;
    }
}

public class StudentInfoSys {
    private static final Scanner scanner = new Scanner(System.in);
    private static final List<Student> studentList = new ArrayList<>();

    public static void main(String[] args) {
        int choice;
        do {
            MainMenu();
            choice = scanner.nextInt();
            switch (choice) {
                case 1:
                    inputStudentInfo();
                    break;
                case 2:
                    searchStudentInfo();
                    break;
                case 3:
                    deleteStudentInfo();
                    break;
                case 4:
                    modifyStudentInfo();
                    break;
                case 5:
                    insertStudentInfo();
                    break;
                case 6:
                    sortStudentInfo();
                    break;
                case 7:
                    countStudents();
                    break;
                case 8:
                    displayAllStudents();
                    break;
                case 0:
                    System.out.println("感谢使用，再见！");
                    break;
                default:
                    System.out.println("输入无效，请重新选择(0-8)");
            }
        } while (choice != 0);
    }

    private static void inputStudentInfo() {
        Student student = new Student();
        System.out.println("--- 录入学生信息 ---");

        System.out.print("请输入学号: ");
        student.setId(scanner.next());

        System.out.print("请输入姓名: ");
        student.setName(scanner.next());

        System.out.print("请输入语文成绩: ");
        student.setChinese(scanner.nextDouble());

        System.out.print("请输入数学成绩: ");
        student.setMath(scanner.nextDouble());

        System.out.print("请输入英语成绩: ");
        student.setEnglish(scanner.nextDouble());

        // 计算总分
        student.setSum(student.getChinese() + student.getMath() + student.getEnglish());

        // 设置当前时间为录入时间
        student.setDateTime(LocalDateTime.now());

        // 将学生对象添加到集合中
        studentList.add(student);

        System.out.println("学生信息录入成功!");
        System.out.println(student);
    }

    private static void searchStudentInfo() {
        int choice;
        do {
            Menu2();
            choice = scanner.nextInt();
            switch (choice) {
                case 21:
                    // 同学们可以在这里编写自己的查询函数逻辑
                    // 不过更建议放到子函数里面
                    System.out.println("执行查询功能");
                    break;
                case 22:
                    // 总分分数线查询的意思，是输入一个分数线，把高于这个分数线的学生信息显示出来。
                    break;
                case 23:
                    break;
                case 20:
                    return; // 直接退出查找函数，回到上级菜单。
                default:
                    System.out.println("输入无效，请重新选择(20-23)");
            }
        } while (choice != 0);
    }

    private static void deleteStudentInfo() {
        System.out.println("执行删除学生信息功能");
        // 指定一个学生 id 然后完成从集合里删除。
        // 注意如果 id 不存在，则提示用户 id 不存在。
        // 遍历找到  id 的学生位置，然后删除
        // 可以考虑使用 List 的 remove(int index) 方法，在指定位置删除元素
    }

    private static void modifyStudentInfo() {
        System.out.println("执行修改学生信息功能");
        // 给用户发提示： 输入 id，然后修改对应学生的信息。
        // 可以考虑使用 List 的 set(int index, E element) 方法，在指定位置修改元素
    }

    private static void insertStudentInfo() {
        System.out.println("执行插入学生信息功能");
        // 给用户发提示： 输入 id，然后在该 ID 学生后，插入对应学生的信息。
        // 可以考虑使用 List 的 add(int index, E element) 方法，在指定位置插入元素
    }

    private static void sortStudentInfo() {
        System.out.println("执行排序功能");
        // 参考菜单 2 的实现方式
        // 具体排序功能，可以用 Collection.sort(List<T> list,  Comparator<? super T> c) 方法
        // 记得自己实现一个比较器
    }

    private static void countStudents() {
        System.out.println("执行统计学生总数功能");
        // 这个简单，List 有相关方法可以求总数，
        // 不要傻傻的遍历循环自己计数哦。
    }

    private static void displayAllStudents() {
        System.out.println("\n--- 所有学生信息 ---");
        if (studentList.isEmpty()) {
            System.out.println("当前没有学生信息");
            return;
        }

        printTitle();
        for (Student student : studentList) {
            printStudent(student);
        }
        printFooter();
        System.out.println("共 " + studentList.size() + " 条记录");
    }

    /**
     * 我们把输出的格式封装成方法，便于在菜单8打印全部，以及菜单2查询部分时候打印，这样输出的格式保持一致。
     */
    public static void printTitle() {
        System.out.println("+----------------+------------+--------+--------+--------+--------+-------------------------------+");
        System.out.println("|      学号       |    姓名    |  语文   |  数学   |  英语   |  总分   |          录入时间              |");
        System.out.println("+----------------+------------+--------+--------+--------+--------+-------------------------------+");
    }

    public static void printFooter() {
        System.out.println("+----------------+------------+--------+--------+--------+--------+-------------------------------+");
    }

    /**
     * 打印输出学生信息
     * @param student
     */
    public static void printStudent(Student student) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.printf("| %-14s | %-10s | %6.1f | %6.1f | %6.1f | %6.1f | %-28s |\n",
                student.getId(),
                student.getName(),
                student.getChinese(),
                student.getMath(),
                student.getEnglish(),
                student.getSum(),
                student.getDateTime().format(dtf) // 瞪大眼睛看，这里是链式调用
        );
    }

    // 主菜单显示方法
    public static void MainMenu() {
        System.out.println();
        System.out.println("    |-----------学生信息管理系统-----------|");
        System.out.println("    |                                   |");
        System.out.println("    |         1. 录入学生信息             |");
        System.out.println("    |         2. 查找学生信息             |");
        System.out.println("    |         3. 删除学生信息             |");
        System.out.println("    |         4. 修改学生信息             |");
        System.out.println("    |         5. 插入学生信息             |");
        System.out.println("    |         6. 排序所有学生             |");
        System.out.println("    |         7. 统计学生总数             |");
        System.out.println("    |         8. 显示所有学生信息          |");
        System.out.println("    |         0. 退出系统                |");
        System.out.println("    |                                   |");
        System.out.println("    |-----------------------------------|");
        System.out.println("              请选择(0-8):");
    }

    // 查找学生信息子菜单
    public static void Menu2() {
        System.out.println();
        System.out.println("    |-----------学生信息管理系统-----------|");
        System.out.println("    |                                   |");
        System.out.println("    |         21. 按学号精确查询           |");
        System.out.println("    |         22. 总分分数线查询           |");
        System.out.println("    |         23. 姓名模糊查询            |");
        System.out.println("    |         20. 返回上级               |");
        System.out.println("    |                                   |");
        System.out.println("    |-----------------------------------|");
        System.out.println("              请选择(20-23):");
    }

    public static void Menu6() {
        System.out.println();
        System.out.println("    |-----------学生信息管理系统-----------|");
        System.out.println("    |                                   |");
        System.out.println("    |         61. 按总分降序排            |");
        System.out.println("    |         62. 按总分升序排            |");
        System.out.println("    |         63. 按时间降序排            |");
        System.out.println("    |         60. 返回上级               |");
        System.out.println("    |                                   |");
        System.out.println("    |-----------------------------------|");
        System.out.println("              请选择(60-63):");
    }

}
